﻿// PBag.h: CPBag 的声明

#pragma once
#include "resource.h"       // 主符号



#include "ClntCom_i.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”，原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

using namespace ATL;

typedef struct _DATATYPE
{
    TCHAR	szName[0x40];
    TCHAR	szString[0x40];
} DATATYPE, * LPDATATYPE;

// CPBag

class ATL_NO_VTABLE CPBag :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPBag, &CLSID_PBag>,
    public IDispatchImpl<IPBag, &IID_IPBag, &LIBID_ClntComLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IPropertyBag
{
private:
    HANDLE	m_hFile;
    UINT	cCount;
    DATATYPE Data;

public:
    CPBag()
    {
        m_hFile = nullptr;
        cCount = 0;
        RtlZeroMemory(&Data, sizeof(DATATYPE));
    }

    DECLARE_REGISTRY_RESOURCEID(106)

    BEGIN_COM_MAP(CPBag)
        COM_INTERFACE_ENTRY(IPBag)
        COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY(IPropertyBag)
    END_COM_MAP()

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        UINT i = 0;
        DWORD dwBytes;
        m_hFile = CreateFile(L"..//Bin//a", GENERIC_ALL, FALSE, nullptr, OPEN_ALWAYS, 
            FILE_ATTRIBUTE_NORMAL, nullptr);
        DWORD re = GetLastError();
        if (re == 0)
        {
            WriteFile(m_hFile, &i, sizeof(UINT), &dwBytes, nullptr);
            cCount = 0;
        }
        else
        {
            ReadFile(m_hFile, &cCount, sizeof(UINT), &dwBytes, nullptr);
        }
        return S_OK;
    }

    void FinalRelease()
    {
        if (m_hFile)
            CloseHandle(m_hFile);
    }

public:
    virtual /* [local] */ HRESULT STDMETHODCALLTYPE Read(
        /* [in] */ LPCOLESTR pszPropName,
        /* [out][in] */ VARIANT* pVar,
        /* [unique][in] */ IErrorLog* pErrorLog
    );

    virtual HRESULT STDMETHODCALLTYPE Write(
        /* [in] */ __RPC__in LPCOLESTR pszPropName,
        /* [in] */ __RPC__in VARIANT* pVar
    );
};

OBJECT_ENTRY_AUTO(__uuidof(PBag), CPBag)
